<?php
   include_once "OperacionArchivoProperties.php";
   
   if ( !defined( "PROPERTIES_CARACTER_COMENTARIO" ) )
     {
        include_once "../../../config/Constantes.php";
     }

/** 
 * Nombre: Properties
 * Autor : Juan Jose Muñiz Juarez
 * Fecha : 05/03/2012
 * Version: 1.0
 * Descripcion: Permite realizar operaciones en archivos Properties, ademas de permitir accesar a los valores registrados
 */
class Properties
   {
      private $_properties;
      private $_valor;

      function __construct( $load_file = false )
        {
           if ( $load_file )
             {
                $this -> loadFileProperties( "" );
             }
        }

         /**
          * 
          * Metodo: loadFileProperties
          * Descripcion: Permite cargar la informacion de un archivo con extension definida en la constante PROPERTIES_EXTENSION_ARCHIVO, 
          *              devuelve una Excepcion si el archivo no es 
          * Fecha de Creacion: 06/03/2012 19:33:01
          * Autor: Juan José Muñiz Juárez
          * params: @param unknown_type $file
          * return: return_type
          */
      public function loadFileProperties( $file, $anexar_contenido = false )
         {
            if ( empty( $file ) )
             {                         
                 return false;
             }

           if ( defined( "PROPERTIES_EXTENSION_ARCHIVO" ) )
             {
                $extension = PROPERTIES_EXTENSION_ARCHIVO; 
             }  
           else
             {
                $extension = ".properties";   
             }  
             
           if ( strpos( $file, $extension ) === false )
             {
                throw new Exception( "Solo se pueden cargar archivos $extension" ); 
             }   
             
           if ( $anexar_contenido == false )  
             {
                $this -> _properties = OperacionArchivoProperties :: leerArchivoProperties ( $file );    
               // var_dump( $this -> _properties);       
             }
           else
             {                
                if ( $this -> _properties )
                  {                    
                     $this -> _properties = array_merge( $this -> _properties, OperacionArchivoProperties :: leerArchivoProperties ( $file ) );   
                  }
             }  
         }

         /**
          * 
          * Metodo: getProperty
          * Descripcion: Devuelve el valor de la propiedad que se pasa como parametro
          * Fecha de Creacion: 06/03/2012 19:32:57
          * Autor: Juan José Muñiz Juárez
          * params: @param unknown_type $name
          * params: @return unknown|string
          * return: unknown|string
          */
       public function getProperty( $name, $formato_texto = false )
         {
            if ( $this -> _properties )
              {
                 if ( is_array( $this -> _properties ) && count( $this -> _properties ) )
                   {                      
                      if ( defined( "PROPERTIES_CARACTER_COMENTARIO" ) )
                        {
                           $caracter_comentario = explode( ",", PROPERTIES_CARACTER_COMENTARIO );
                        }
                      else
                        {
                           $caracter_comentario = array( "#", "//" );
                        }  
                        
                      foreach( $this -> _properties as $valores )
                        {
                           if ( trim( $valores[ PROPERTIES_NOMBRE_CLAVE ] ) == $name )
                             {
                                $valor = $valores[ PROPERTIES_NOMBRE_VALOR ];
                                                               
                                if ( $caracter_comentario )
                                  {
                                     if ( count( $caracter_comentario ) > 0 )
                                      {
                                         foreach( $caracter_comentario as $caracter )
                                           {
                                              // Verificamos si tiene adherido un comentario en la linea
                                             if ( strpos( $valor, $caracter ) > 0 )
                                               {
                                                 list( $valor_r, $comentario ) = explode( $caracter, $valor );
                                              
                                                 $valor = $valor_r;
                                                 break;
                                               } 
                                           }
                                      }
                                  }                                                                
                                 
                                  
                                if ( $formato_texto )  
                                  {
                                     return trim( $valores[ PROPERTIES_NOMBRE_CLAVE ] ) . PROPERTIES_CARACTER_ASIGNACION . $valor;  
                                  }
                                else 
                                  {  
                                     return $valor;
                                  }
                             }
                        }
                   } 
                   
                return "";   
              }       
         }
         
         /**
          * 
          * Metodo: getPropertiesClaveValorTexto
          * Descripcion: Devuelve los valores contenidos de la clave que se pasa por parametro, 
          *              devuelve el valor <b>propiedad = valor</b>
          * Fecha de Creacion: 30/03/2012 16:37:47
          * Autor: Juan José Muñiz Juárez
          * params: @param unknown_type $name
          * params: @return Ambigous <string, multitype:, unknown>
          * return: Ambigous <string, multitype:, unknown>
          */
       public function getPropertiesClaveValorTexto( $name )
         {
            return $this -> getProperty($name, true );
         }  

         /**
          * 
          * Metodo: setProperty
          * Descripcion: Permite asignar/remplazar el valor de una propiedad 
          * Fecha de Creacion: 25/03/2012 21:37:53
          * Autor: Juan José Muñiz Juárez
          * params: @param unknown_type $name
          * params: @param unknown_type $value
          * return: void
          */
       public function setReplaceProperty( $name, $value )
         {
            if ( empty( $name ) )
              {
                 return;
              }
              
            if ( empty( $value ) )
              {
                 return;
              }  
              
             if ( $this -> _properties )
               {
                  if ( is_array( $this -> _properties ) && count( $this -> _properties ) )
                    {
                       $cont = 0;
                       
                       foreach( $this -> _properties as $datos )
                         {                            
                            if ( trim( $datos[ PROPERTIES_NOMBRE_CLAVE ] ) == $name )
                              {
                                $this -> _properties[ $cont ] = array( PROPERTIES_NOMBRE_CLAVE => $name, PROPERTIES_NOMBRE_VALOR => $value );
                                break;
                              }
                              
                            $cont++;  
                         }
                    }
               }  
         }
         
         /**
          * 
          * Metodo: setComment
          * Descripcion: 
          * Fecha de Creacion: 27/03/2012 15:16:57
          * Autor: Juan José Muñiz Juárez
          * params: @param unknown_type $comment
          * return: return_type
          */
       public function setComment( $comment )
         {
            if ( !$this -> _properties )
              {
                 $this -> _properties = array();
              }
              
            $this -> _properties[] = array( PROPERTIES_NOMBRE_CLAVE => PROPERTIES_NOMBRE_COMENTARIO, PROPERTIES_NOMBRE_VALOR => $comment );
         }
         
         /**
          * 
          * Metodo: setProperty
          * Descripcion: 
          * Fecha de Creacion: 27/03/2012 15:25:04
          * Autor: Juan José Muñiz Juárez
          * params: @param unknown_type $name
          * params: @param unknown_type $value
          * return: return_type
          */
       public function setProperty( $name, $value )
         {
            if ( !$this -> _properties )
              {
                 $this -> _properties = array();
              }
            
            $this -> _properties[] = array( PROPERTIES_NOMBRE_CLAVE => $name, PROPERTIES_NOMBRE_VALOR => $value );
         }  

         /**
          * 
          * Metodo: setPropertyArray
          * Descripcion: Asigna el valor de un arreglo dentro del que se genera automaticamente con el contenido del 
          *              archivo que se carga, este arreglo debe respetar la forma con la que se obtienen los datos y
          *              debe estar construido de la siguiente forma
          *                 $datos = <b>array( array( PROPERTIES_NOMBRE_CLAVE => "NOMBRE DE LA CLAVE", PROPERTIES_NOMBRE_VALOR => "VALOR QUE TENDRA LA CLAVE" ),
          *                                 array( PROPERTIES_NOMBRE_CLAVE => "NOMBRE DE LA CLAVE", PROPERTIES_NOMBRE_VALOR => "VALOR QUE TENDRA LA CLAVE" ), ETC... );</b>
          * Fecha de Creacion: 25/03/2012 22:00:27
          * Autor: Juan José Muñiz Juárez
          * params: @param unknown_type $names_values
          * params: @param unknown_type $replace_array
          * return: return_type
          */
       public function setPropertyArray( $names_values, $replace_array = false )
         {
            if ( $replace_array )
              {
                 unset( $this -> _properties );
                 
                 $this -> _properties = $names_values;
              }
            else
             {
               $this -> _properties = array_merge( $this -> _properties, $names_values );  
             }  
         }

         /**
          * 
          * Metodo: getProperties
          * Descripcion: Devuelve un arreglo con los valores del contenido del archivo(s) properties que se le envio
          *              devuelve un arreglo multidensional que esta compuesto de la siguiente forma:
          *                       datos( PROPERTIES_NOMBRE_CLAVE , PROPERTIES_NOMBRE_VALOR ) = properties[ 0 ];
          * Fecha de Creacion: 25/03/2012 22:04:21
          * Autor: Juan José Muñiz Juárez
          * params: 
          * return: return_type
          */
       public function getProperties()
         {
            return $this -> _properties;
         }  
         
       public function saveProperties( $file, $replace_file )
         {
            OperacionArchivoProperties::guardarProperties($file, $this -> _properties, $replace_file );
         }  
   }
   
   ///////////////////////////// EJEMPLO DE USO DE LA CLASE ///////////////////////////////////////////////
   
   /*$properties = new Properties();
   
   $properties -> setComment( "######################################################################################################################### " );
   $properties -> setComment( "# Nombre: ARCHIVO PROPERTIES																			 			 	                         # " );
   $properties -> setComment( "# Fecha : 																												                            # " );
   $properties -> setComment( "# Version: 																												                            # " );
   $properties -> setComment( "# Autor : Juan Jose Muñiz Juarez																					                            # " );
   $properties -> setComment( "######################################################################################################################### " );
   $properties -> setComment( "# 													Configuracion para logs												                         #" );
   $properties -> setProperty( "Nombre", "Juan Jose");
   $properties -> setProperty( "Apaterno", "Muñiz");
   $properties -> setProperty( "Amaterno", "Juarez");
   $properties -> saveProperties( "C:\\config.properties", false );
   */
   //var_dump( $properties -> getProperties() );
   
   //$properties = new Properties( "" );
   /*if ( defined( "PROPERTIES_ARCHIVO" ) )
    {
      $file = PROPERTIES_ARCHIVO;
    }
   else
    {
      $file = "C:\\wamp\\www\\SITKD\\sistema\\config\\otro.properties";
   // }
   
   $prop = new Properties();
   $prop -> loadFileProperties( $file );
   echo $prop -> getProperty( "log_ruta_archivo" );
   $prop -> setProperty( "log_nombre_archivo", "Prueba" );
   echo "<br />";
   echo $prop -> getProperty( "log_nombre_archivo" );
   /*
   echo "<br /><br />--";
   $file = "C:\\wamp\\www\\SITKD\\sistema\\config\\configuracion.properties";
   //$prop2 = new Properties();
   $prop -> loadFileProperties( $file, true );
   echo $prop -> getProperty( "log_ruta_archivo" );  
   echo "<br />";
   echo $prop -> getProperty( "log_nombre_archivo" );
   
   
   $datos_array = $prop -> getProperties();

   foreach( $datos_array as $datos )
     {
        echo "<br />";
        var_dump( $datos );
     }
    echo "<br />----------------------------------------------------------<br />";
    
    $nuevos_datos = array( array( "clave" => "Nombre", "valor" => "Juan Jose" ), 
                    array( "clave" => "Apellido Paterno", "valor" => "Muñiz" ), 
                    array( "clave" => "Apellido Materno", "valor" => "Juarez" ) );
    
    $prop -> setPropertyArray( $nuevos_datos, true );
    
    $datos_array = $prop -> getProperties();
    foreach( $datos_array as $datos )
    {
       echo "<br />";
       var_dump( $datos );
    }
    echo "<br />----------------------------------------------------------<br />";
    
   foreach( $datos_array as $datos )
     {
        echo "<br />";
        echo $datos[ 'clave' ] . " - " . $datos[ 'valor' ];        
     }  */
   